#!/bin/bash

# Blog API 部署脚本
# 用于在本地服务器上部署应用

set -e  # 遇到错误立即退出

echo "=========================================="
echo "Blog API 部署脚本"
echo "=========================================="

# 配置变量（如果环境变量未设置，使用默认值）
APP_NAME="${APP_NAME:-blog-api}"
DEPLOY_DIR="${DEPLOY_DIR:-/var/lib/jenkins/apps/blog-api}"
PORT="${PORT:-3000}"

# 颜色定义
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
RED='\033[0;31m'
NC='\033[0m' # No Color

# 函数：打印成功消息
success() {
    echo -e "${GREEN}✓ $1${NC}"
}

# 函数：打印警告消息
warning() {
    echo -e "${YELLOW}⚠ $1${NC}"
}

# 函数：打印错误消息
error() {
    echo -e "${RED}✗ $1${NC}"
}

# 1. 创建部署目录
echo ""
echo "1. 创建部署目录..."
mkdir -p "$DEPLOY_DIR"
success "部署目录创建完成: $DEPLOY_DIR"

# 2. 停止旧的应用
echo ""
echo "2. 停止旧的应用..."
pm2 stop "$APP_NAME" 2>/dev/null || warning "应用未运行或已停止"
pm2 delete "$APP_NAME" 2>/dev/null || true

# 3. 清理旧文件
echo ""
echo "3. 清理旧文件..."
rm -rf "$DEPLOY_DIR"/*
success "旧文件清理完成"

# 4. 复制新文件
echo ""
echo "4. 复制新文件..."
cp -r deploy/* "$DEPLOY_DIR/"
success "文件复制完成"

# 5. 安装依赖
echo ""
echo "5. 安装生产依赖..."
cd "$DEPLOY_DIR"
npm install --production --silent
success "依赖安装完成"

# 6. 启动应用
echo ""
echo "6. 启动应用..."
# 启动 PM2 应用（不使用 watch 模式以提高稳定性）
pm2 start src/server.js --name "$APP_NAME"
success "应用启动成功"

# 7. 保存 PM2 配置
echo ""
echo "7. 保存 PM2 配置..."
pm2 save
success "PM2 配置已保存"

# 8. 显示应用状态
echo ""
echo "8. 应用状态："
pm2 list

# 9. 健康检查
echo ""
echo "9. 健康检查..."
sleep 3  # 等待应用启动
if curl -s -o /dev/null -w "%{http_code}" http://localhost:$PORT/health | grep -q "200"; then
    success "健康检查通过"
    echo ""
    echo "=========================================="
    echo "✅ 部署成功！"
    echo "=========================================="
    echo "应用名称: $APP_NAME"
    echo "部署目录: $DEPLOY_DIR"
    echo "访问地址: http://localhost:$PORT"
    echo "健康检查: http://localhost:$PORT/health"
    echo "=========================================="
else
    error "健康检查失败"
    echo "请检查应用日志："
    pm2 logs "$APP_NAME" --lines 20
    exit 1
fi
